MetaMask Snaps 日本語ドキュメント: 開発ガイド
開発者プレビューソフトウェア
Snaps はリリース前のソフトウェアです。
Snaps の開発は、他の JavaScriptプロジェクト の開発とよく似ていますが、熟練した開発者でも初めて目にすることがあります。詳しくはこちらをご覧ください。
Snaps CLI
まずはじめに、@metamask/snaps-cli が用意されており、Snaps の開発を始めるにあたって最も重要なツールの一つとなることを知っておいてください。この CLI は npm や yarn を使ってグローバルにインストールすることができ、Snaps プロジェクトの作成、ローカル開発用のビルド、実行、および Snaps の配布を行うためのコマンドを提供します。mm-snap --help を実行すると、詳細な使用方法が表示されます。 Snap の構造
前提となるドキュメント
Snaps は MetaMask の内部でサンドボックス化された環境で動作する JavaScript プログラムです。現時点では、スナップは npm パッケージとして公式の npm レジストリ で配布する必要がありますが、将来的には異なる配布メカニズムがサポートされる予定です。Snaps のテンプレートリポジトリのディレクトリ構造を見ると、以下のようになっています。 code:text
template-snap-monorepo/
├─ packages/
│ ├─ site/
| | |- src/
| | | |- App.tsx
| | ├─ package.json
| | |- ...(react app content)
| |
│ ├─ snap/
| | ├─ src/
| | | |- index.ts
| | ├─ snap.manifest.json
| | ├─ package.json
| | |- ... (snap content)
├─ package.json
├─ ... (other stuff)
index.js 以外のソースファイルは、そのインポートを通じて配置されます。このデフォルト設定は、設定ファイル snap.config.json を使用して上書きすることができます。 Snap プロジェクトの作成
mm-snap init を使用して新しい Snap プロジェクトを作成すると、これらのファイルがすべて含まれていることが確認できると思います。とはいえ、Snaps のテンプレートリポジトリ をクローンするのが、おそらく最良の方法でしょう。 このセクションでは、スナップの主要な構成要素であるソースコード、マニフェスト(およびpackage.json)、バンドルファイルについて説明します。
Snap のソースコード
JavaScript や TypeScript の開発に慣れている方であれば、Snap を開発することはとても身近に感じられるはずです。ここでは、hello-snap という簡単な Snap を考えてみましょう。
code:js
module.exports.onRpcRequest = async ({ origin, request }) => {
switch (request.method) {
case 'hello':
return 'world!';
default:
throw new Error('Method not found.');
}
};
Snap は外部と通信するために、onRpcRequest というエクスポートされた関数を公開し、独自の JSON-RPC API を実装する必要があります。Snap が外部のエンティティ(Dapps や他の Snap)から JSON-RPC リクエストを受信すると、このハンドラが上記のパラメータと共に呼び出されます。
JSON-RPC API を公開できることに加え、Snap はグローバルオブジェクトである wallet にアクセスすることができます。このオブジェクトは、window.ethereum を介して Dapps に公開される API と非常によく似た API を公開しています。wallet.request() で送信されたメッセージは、MetaMask で受信・処理されます。
Dapp から hello-snap を使う場合は、次のようにします。
code:js
await ethereum.request({
method: 'wallet_enable',
params: [
{
wallet_snap: {
'npm:hello-snap': {
version: '^1.0.0',
},
},
},
],
});
const hello = await ethereum.request({
method: 'wallet_invokeSnap',
});
console.log(hello); // 'world!'
Snap の RPC API は、有効な JSON-RPC API であれば、完全に自由です。 Snap は RPC API を持つ必要があるのでしょうか?
いえ、それもあなた次第です。JSON-RPC リクエストを受信して応答しなくても、Snap が何か便利なことをできるのであれば、onRpcRequest のエクスポートをスキップすることができます。しかし、特定のプロトコルのユーザーの鍵を管理し、Snap 経由でそのプロトコルのトランザクションを送信するような Dapp を作成したい場合は RPC API を実装する必要があります。
マニフェスト
設定ファイル
バンドルファイル
Snap の開発
リソースとツール